From 511d7dce64047133708b7a92e7519e2423cb1ba5 Mon Sep 17 00:00:00 2001 From: "djm@kirby.fc.hp.com" Date: Wed, 21 Dec 2005 08:53:40 -0600 Subject: [PATCH] This patch is intended to correct the number of CPUs. Our IPF machines are the following configurations. - Total logical cpus = 16 -- 4 sockets -- 2 cores -- 2 threads I changed the setting of BIOS, and invalidated the hyperthread, and I built Xen with NR_CPUS=8. As a result, it became like attached file xendmesg1.txt. - Available cpus 3 - Total cpus 8 Next, I built Xen with NR_CPUS=16. As a result, it became like attached file xendmesg2.txt. - Available cpus 8 - Total cpus 16 I thought not to match the analysis of the lsapic entry to the value of NR_CPUS. It is an outline of patch as follows. 1. Count up the lsapic entry by using acpi_table_count_madt()/acpi_table_count_madt_family(). 2. Call acpi_parse_lsapic() by using the number of lsapic entries. 3. Count up the available_cpus by using acpi_parse_lsapic(), however NR_CPUS is not exceeded. Signed-off-by: Masaki Kanno Best Regards, Kan --- xen/arch/ia64/xen/acpi.c | 27 ++++++++++++++----- xen/drivers/acpi/tables.c | 57 +++++++++++++++++++++++++++++++++++++++ xen/include/xen/acpi.h | 1 + 3 files changed, 79 insertions(+), 6 deletions(-) diff --git a/xen/arch/ia64/xen/acpi.c b/xen/arch/ia64/xen/acpi.c index f0eab76870..d307c44a52 100644 --- a/xen/arch/ia64/xen/acpi.c +++ b/xen/arch/ia64/xen/acpi.c @@ -203,12 +203,18 @@ acpi_parse_lsapic (acpi_table_entry_header *header, const unsigned long end) else { printk(" enabled"); #ifdef CONFIG_SMP - smp_boot_data.cpu_phys_id[available_cpus] = (lsapic->id << 8) | lsapic->eid; - if (hard_smp_processor_id() - == (unsigned int) smp_boot_data.cpu_phys_id[available_cpus]) - printk(" (BSP)"); -#endif + if (available_cpus < NR_CPUS) { + smp_boot_data.cpu_phys_id[available_cpus] = (lsapic->id << 8) | lsapic->eid; + if (hard_smp_processor_id() + == (unsigned int) smp_boot_data.cpu_phys_id[available_cpus]) + printk(" (BSP)"); + ++available_cpus; + } else { + printk(" - however, ignored..."); + } +#else ++available_cpus; +#endif } printk("\n"); @@ -598,8 +604,17 @@ acpi_boot_init (void) if (acpi_table_parse_madt(ACPI_MADT_LAPIC_ADDR_OVR, acpi_parse_lapic_addr_ovr, 0) < 0) printk(KERN_ERR PREFIX "Error parsing LAPIC address override entry\n"); +#ifdef CONFIG_SMP + int count; + if ((count = acpi_table_count_madt(ACPI_MADT_LSAPIC)) < 1) { + printk(KERN_ERR PREFIX "Error parsing MADT - no LSAPIC entries\n"); + } else { + acpi_table_parse_madt(ACPI_MADT_LSAPIC, acpi_parse_lsapic, count); + } +#else if (acpi_table_parse_madt(ACPI_MADT_LSAPIC, acpi_parse_lsapic, NR_CPUS) < 1) - printk(KERN_ERR PREFIX "Error parsing MADT - no LAPIC entries\n"); + printk(KERN_ERR PREFIX "Error parsing MADT - no LSAPIC entries\n"); +#endif if (acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi, 0) < 0) printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n"); diff --git a/xen/drivers/acpi/tables.c b/xen/drivers/acpi/tables.c index 1c718efc88..837aa0d321 100644 --- a/xen/drivers/acpi/tables.c +++ b/xen/drivers/acpi/tables.c @@ -607,3 +607,60 @@ acpi_table_init (void) return 0; } + +int __init +acpi_table_count_madt_family ( + enum acpi_table_id id, + unsigned long madt_size, + int entry_id) +{ + void *madt = NULL; + acpi_table_entry_header *entry; + unsigned int count = 0; + unsigned long madt_end; + unsigned int i; + + /* Locate the MADT (if exists). There should only be one. */ + + for (i = 0; i < sdt_count; i++) { + if (sdt_entry[i].id != id) + continue; + madt = (void *) + __acpi_map_table(sdt_entry[i].pa, sdt_entry[i].size); + if (!madt) { + printk(KERN_WARNING PREFIX "Unable to map %s\n", + acpi_table_signatures[id]); + return -ENODEV; + } + break; + } + + if (!madt) { + printk(KERN_WARNING PREFIX "%s not present\n", + acpi_table_signatures[id]); + return -ENODEV; + } + + madt_end = (unsigned long) madt + sdt_entry[i].size; + + /* Parse all entries looking for a match. */ + + entry = (acpi_table_entry_header *) + ((unsigned long) madt + madt_size); + + while (((unsigned long) entry) + sizeof(acpi_table_entry_header) < madt_end) { + if (entry->type == entry_id) count++; + + entry = (acpi_table_entry_header *) + ((unsigned long) entry + entry->length); + } + + return count; +} + + +int __init +acpi_table_count_madt (enum acpi_madt_entry_id id) +{ + return acpi_table_count_madt_family(ACPI_APIC, sizeof(struct acpi_table_madt), id); +} diff --git a/xen/include/xen/acpi.h b/xen/include/xen/acpi.h index b84f047651..f8e3a1bdef 100644 --- a/xen/include/xen/acpi.h +++ b/xen/include/xen/acpi.h @@ -390,6 +390,7 @@ int acpi_table_parse_srat (enum acpi_srat_entry_id id, acpi_madt_entry_handler h void acpi_table_print (struct acpi_table_header *header, unsigned long phys_addr); void acpi_table_print_madt_entry (acpi_table_entry_header *madt); void acpi_table_print_srat_entry (acpi_table_entry_header *srat); +int acpi_table_count_madt (enum acpi_madt_entry_id id); /* the following four functions are architecture-dependent */ void acpi_numa_slit_init (struct acpi_table_slit *slit); -- 2.30.2